// Package util
// @Title util[简述该包的主要作用]
// @Description
// @Author  cnHuaShao
// @since v0.0.1
// @Version v1.0.0
// @Date 2024/4/21 21:49
// @Update 2024/4/21 21:49
package util

import (
	"fmt"
	"io"
	"math/rand"
	"os"
)

// CreateFolder
// @Description: 根据传入的地址判定文件夹是否存在，不存在自动创建，并授权775权限
// @param folder
// @return error
func CreateFolder(folder string) error {
	if _, err := os.Stat(folder); os.IsNotExist(err) {
		// 先创建文件夹
		if err := os.Mkdir(folder, 0775); err != nil {
			return err
		}
		// 再修改权限，所有人具有读写权限，无执行权限
		if err := os.Chmod(folder, 0775); err != nil {
			return err
		}
	}
	return nil
}

// RandToken 随机名称生成策略
// len 长度
// @return 生成的随机码
func RandToken(len int) string {
	b := make([]byte, len)
	rand.Read(b)
	return fmt.Sprintf("%x", b)
}

// IsDir
// @Description: 文件夹是否存在
// @param path
// @return bool
func IsDir(path string) bool {
	s, err := os.Stat(path)
	if err != nil {
		return false
	}
	return s.IsDir()
}

// IsExistAndCreateDir 创建文件夹
// path 文件夹存放地址
// @return bool 是否成功执行
// @return err 异常
func IsExistAndCreateDir(path string) (bool, error) {
	// 判断文件夹是否存在
	if _, err := os.Stat(path); os.IsNotExist(err) {
		// 创建文件夹，注意这里给的权限时777，可以将这个参数提取出来作为参数传入。
		if err := os.Mkdir(path, os.ModePerm); err != nil {
			return false, err
		} else {
			return true, nil
		}
	} else {
		return true, err
	}
}

// ComputeFileSize
// @Description: 文件大小与kb、mb转换
// @param fileSize 文件大小
// @return string 拼接后的显示文字
func ComputeFileSize(fileSize int64) string {
	if fileSize < 1024 {
		return fmt.Sprintf("%.2fB", float64(fileSize)/float64(1))
	} else if fileSize < (1024 * 1024) {
		return fmt.Sprintf("%.2fKB", float64(fileSize)/float64(1024))
	} else if fileSize < (1024 * 1024 * 1024) {
		return fmt.Sprintf("%.2fMB", float64(fileSize)/float64(1024*1024))
	} else if fileSize < (1024 * 1024 * 1024 * 1024) {
		return fmt.Sprintf("%.2fGB", float64(fileSize)/float64(1024*1024*1024))
	} else if fileSize < (1024 * 1024 * 1024 * 1024 * 1024) {
		return fmt.Sprintf("%.2fTB", float64(fileSize)/float64(1024*1024*1024*1024))
	} else {
		return fmt.Sprintf("%.2fEB", float64(fileSize)/float64(1024*1024*1024*1024*1024))
	}
}

// TextSubString
// @Description: 文件名称截取函数
// @param text 文本信息
// @param length 文本保留长度
// @return string 处理后的文件名称
func TextSubString(text string, length int) string {
	if len(text) > length {
		return text[0:length] + "..."
	} else {
		return text
	}
}

// IsExists
// @Description: 文件是否存在
// @param path
// @return os.FileInfo
// @return bool
// @author zhangyc
func IsExists(path string) (os.FileInfo, bool) {
	f, err := os.Stat(path)
	return f, err == nil || os.IsExist(err)
}

// checkFileIsExist
// @Description: 判断文件是否存在  存在返回 true 不存在返回false
// @param filename
// @return bool
func checkFileIsExist(filename string) bool {
	var exist = true
	if _, err := os.Stat(filename); os.IsNotExist(err) {
		exist = false
	}
	return exist
}

// WriteString
// @Description: 对其文件进行写入操作
// @param filename
// @param content
// @return error
func WriteString(filename string, content string) error {
	if checkFileIsExist(filename) { // 如果文件存在
		f, err := os.OpenFile(filename, os.O_APPEND, 0666) // 打开文件
		if err != nil {
			return err
		}
		_, err = io.WriteString(f, content) // 写入文件(字符串)
		if err != nil {
			return err
		}
	} else {
		f, err := os.Create(filename) // 创建文件
		if err != nil {
			return err
		}
		_, err = io.WriteString(f, content) // 写入文件(字符串)
		if err != nil {
			return err
		}
	}
	return nil
}

func ReadTheFile(path string) ([]byte, error) {
	f, err := os.Open(path)
	if err != nil {
		return nil, err
	}
	return io.ReadAll(f)
}

func WriteToFile(fileName string, content []byte) error {
	f, err := os.OpenFile(fileName, os.O_WRONLY|os.O_TRUNC|os.O_CREATE, 0644)
	if err != nil {
		fmt.Println("file create failed. err: " + err.Error())
	} else {
		// offset
		// os.Truncate(filename, 0) //clear os.SEEK_END
		n, _ := f.Seek(0, io.SeekEnd)
		_, err = f.WriteAt(content, n)
		fmt.Println("write succeed!")
		defer f.Close()
	}
	return err
}
